package polymorphicIndex;

public class index {
    public static void main(String[] args) {
        //回去寝室多学习 多扩展
        //面向对象的三大特征:封装 继承 多态;
        //非final static private 修饰->虚方法  C# sharp
        //多态构成的条件:1.继承  2.方法重写 3.父类引用子类对象
        //多态->继承关系 子类继承了父类的成员方法并且重写 父类引用子类对象
        Animal D=new dog();
        Animal C=new cat();
       //面向对象 方便扩展
       //登录一个管理系统  (管理者,学生,老师)
        //创建对象
        Animal b=new dog();
        //父类 对象名=new 子类();
       //1 父类引用了子类对象
        //2 形成了继承/实现关系
        //3 子类继承了父类的成员方法并且重写
        //子类里面继承了父类的被什么修饰的成员方法可以重写?
        // final static private
        Animal a=new dog();
        //调用成员变量,编译看左边 运行也看左边
        //编译看左边,javaC编译代码的时候,会看父类中是否有这个变量  ,有则编译 没有就报错
        //运行也看左边,java运行代码的时候,实际获取的就是左边父类中成员变量的值

        System.out.println(a.name);
        //调用成员方法 ,编译看左边 运行看右边
        //编译看左边 ,javaC编译代码的时候,会看左边的父类中有没有这个方法,如果有则编译成,如果没有则失败
        //运行看右边
        a.show();

        //理解:
        //Animal a=new dog();
        //现在用 a去调用变量和方法的  是的
        //而a是Animal 类型的 ,所以默认都会从Animal 这个类中去找

        //成员变量:在子类的对象中,会把父类的成员变量也继承下: 父:name, 子:name;
        //成员方法:如果子类对方法进行了重写,那么在虚方法表中是会把父类的方法进行覆盖的;


    }
}
class Animal{
    String name="动物";
    public void show(){
        System.out.println("Animal ---show方法");
    }
}
class dog extends Animal{
    String name="狗";
    @Override
    public void show(){
        System.out.println("dog ---dog show 方法");
    }
    public void bark(){
        System.out.println("barking");
    }
}
class cat extends  Animal{
    String name="猫";
    @Override
    public void show(){
        System.out.println("cat ---cat show方法");
    }
}